//
//  EmotionDataTool.swift
//  新浪微博项目
//
//  Created by 王炯 on 16/7/30.
//  Copyright © 2016年 王炯. All rights reserved.
//

import UIKit

// 最大行数
let EmoticonMaxRow = 3
// 最大列数
let EmoticonMaxCol = 7
// 每一页的最多表情数
let EmoticonMaxCount = EmoticonMaxRow*EmoticonMaxCol - 1


//处理plist文件中的数据的单例工具类
class EmotionDataTool: NSObject
{

    //声明一个单例对象
    static let sharedTool:EmotionDataTool = EmotionDataTool()
    
    //(1)懒加载emotionBundle属性(plist文件的来源(来自于某个bundle文件))
    lazy var emotionBundle:NSBundle = {
        
       //(1)bundle文件的路径来源
        let path = NSBundle.mainBundle().pathForResource("Emoticons.bundle", ofType: nil)
        
        //(2)利用路径创建bundle返回
        return NSBundle(path:path!)!
    }()
    
    //(2)通过读取每个文件夹下面的plist文件，获取一维数组(每个文件夹下面的plist文件中的字典转模型)
    //传入的参数是每个文件夹名
    func GetEmotion(name:String) -> [EmotionModel]
    {
        //(1)plist路径
        let path = emotionBundle.pathForResource("\(name)/info.plist", ofType: nil)!
        
        //(2)根据plist生成数组
        let array = NSArray(contentsOfFile: path)!
        
        //(3)创建一个临时的可变数组
        var tempArray:[EmotionModel] = [EmotionModel]()
        
        //(4)遍历array，字典转模型
        for dict in array
        {
            // 创建一个模型
            let model = EmotionModel(dict: dict as! [String: AnyObject])
            
            //在此处根据传入的bunle中的位置文件夹name来设置model所在的路径
            model.path = "\(name)\(model.png ?? "")"
            
            
            // 保存模型
            tempArray.append(model)
        }
        
        return tempArray
    }
    
    //(3)根据上一步的方法懒加载3个一维数组
    //3-1 默认表情
    lazy var defaultEmoticons:[EmotionModel] = {
        return self.GetEmotion("default/")
    }()
    //3-2 emoji
    lazy var emojiEmoticons:[EmotionModel] = {
        return self.GetEmotion("emoji/")
    }()
    //3-3 xlh
    lazy var xlhEmoticons:[EmotionModel] = {
        return self.GetEmotion("lxh/")
    }()
    
    
    /*
     二维数组分析
     默认表情 108
     emoji  80
     浪小花  40
     通过一维数组 得到二位数组
     默认表情(6页)
     [[20],[20],[20],[20],[20],[8]]
     [0,19] [20,39] [40,59] .....
     emoji(4页)
     [[20],[20],[20],[20]]
     浪小花（2页）
     [[20],[20]]
     */
    //(4)分割上面创建的3个一维数组成一个二维数组，二维数组的元素是分割好的几个小数组
    func GetEmotionGroup(emoticons:[EmotionModel]) -> [[EmotionModel]]
    {
        //(1)求总共的页数
        //求页数的算法!!!!!!!
        let pageCount = (emoticons.count + EmoticonMaxCount - 1)/EmoticonMaxCount
        
        //(2)定义一个可变的二维数组
        var emotionGroup:[[EmotionModel]] = [[EmotionModel]]()
        
        //(3)分割数组，创建一些小的数组添加到二维数组中
        for i in 0..<pageCount
        {
            //(1)截取数组的开始位置
            let location = EmoticonMaxCount * i
            //(2)截取数组的长度(<=20）
            var length = EmoticonMaxCount
            //需要判断当不足最大值20的时候,重新弄设置Length
            if emoticons.count - location < length
            {
                length = emoticons.count - location
            }
            //(3)设置range
            let range = NSRange(location: location, length: length)
            //(4)利用NSArray的subarrayWithRange的方法根据range来截取新的array
            let array = (emoticons as NSArray).subarrayWithRange(range) as! [EmotionModel]
            
            //(5)添加到临时的可变二维数组中
            emotionGroup.append(array)
        }
        
    
        return emotionGroup
    }
    
    
    //(5)懒加载三维数组，将上面的一维数组分割重构之后生成的3个二维数组添加到一个三维数组中
    lazy var AllEmotions:[[[EmotionModel]]] = {
        return [
        
        self.GetEmotionGroup(self.defaultEmoticons),
        self.GetEmotionGroup(self.emojiEmoticons),
        self.GetEmotionGroup(self.xlhEmoticons)
        ]
    }()
    
    
    //(6)工具方法，利用EmotionModel中的chs属性遍历查找出相对应的模型属性
    //遍历defaultEmoticons数组和xlhEmoticons数组
    func SearchPng(chs:String?) -> EmotionModel?
    {
        
        //遍历查找默认表情数组
        for model in self.defaultEmoticons
        {
            if model.chs == chs
            {
                return model
            }
        }
        
        //遍历查找xlh表情数组
        for model in self.xlhEmoticons
        {
            if model.chs == chs
            {
                return model
            }
        }
        
        return nil
    }

}
